//针对json的增删改查

/*
增加&&修改数据

@pramas
    obj 操作的json对象
    key 定位元素的key
    value 定位元素的value
    newkey 被添加数据的key
    newvalue 被添加数据的value
    operatetype 值是：true/false
            因为if判断中使用了取反，所以true执行的操作是增加数据，false是修改数据
    return
*/
function JSONmodData(obj,key,value,newkey,newvalue,operatetype){ 
    var flag=false;
    if(obj instanceof Array){
        for(var i=0;i<obj.length;i++ ){
            flag=JSONmodData(obj[i],key,value,newkey,newvalue,operatetype);
        }
    } else if (typeof(obj)=='object'){//obj instanceof Object
        for (var tmp in obj){
            //key和value的作用是精确定位到某一节点
            if(tmp==key&&obj[tmp]==value){
                //当operatetype的值为true，执行的操作是增加数据
                //如果是false时，执行的操作是修改数据
                if(!operatetype){//取反
                    obj[newkey]=newvalue;   //对key的value进行重新编写
                } else {
                    if(obj[newkey] instanceof Array){   //判断newvalue的值是array还是json
                        obj[newkey].push(newvalue); //插入(增加)数据
                    } else {
                        if(newvalue instanceof Array) return;
                        if(typeof(newvalue) =='object'){//newvalue instanceof Object
                            for(var tmp1 in newvalue){
                                obj[newkey][tmp1]=newvalue[tmp1];  
                            }                        
                        }
                    }
                }

                return obj;
            } else if(typeof(obj[tmp])=='object') {//obj[tmp] instanceof Object
                flag= JSONmodData(obj[tmp],key,value,newkey,newvalue,operatetype);
            } else {
                continue;
            }
        }
    } 

    return flag;
}

/*
删除数据

@pramas
	obj 操作的json对象
    key 定位元素的key
    value 定位元素的value
    delkey	被删除的数据

    notice：当delkey没有传值时，key就是被删除的值
*/
function JSONdelData(obj,key,value,delkey){ 

    //删除数据  
    if(obj instanceof Array){
        for(var i=0;i<obj.length;i++){
            JSONdelData(obj[i],key,value,delkey);
        }
    } else if(typeof(obj)=='objct') {//obj instanceof Object
        for(var tmp in obj){
            if(tmp == key&&obj[key] == value) {
                if(!delkey){
                    delete obj[key];
                } else {
                    delete obj[delkey];
                }
            } else if (typeof(obj[tmp]) =='object') {//obj[tmp] instanceof Object
                JSONdelData(obj[tmp],key,value,delkey);
            } 
        }
    }           
    return obj;
}


/*
查找数据
pramas
    obj 操作的json对象
    key 被查找的key
    value 被查找的value

return 该节点本身的的集合以及父级
*/
function JSONfindArr(obj,key,value,siblingkey){ 
    var aa=null;
    if(obj==null)return aa;
    if(obj instanceof Array){
        for(var i=0;i<obj.length;i++ ){
            aa=JSONfindArr(obj[i],key,value,siblingkey);
            if(aa!=null)return aa;
        }
    } else if(typeof(obj)=='object'){//if (obj instanceof Object)
        for (var tmp in obj){
            if(tmp==key&&obj[tmp]==value)
             {
                //如果输入了兄弟节点就返回兄弟节点
                if(siblingkey){
                    return obj[siblingkey];
                }
                return {parentNode:obj,
                    node: '{'+tmp+':'+obj[tmp]+'}'};
             } else if(typeof(obj[tmp])=='object') {// if(obj[tmp] instanceof Object) 
                 aa=JSONfindArr(obj[tmp],key,value,siblingkey);
                 if(aa!=null) return aa;
             }else{
                continue;
             }

        }
    } //else {
      //  return {
       //     parentNode: null,
       //     node: null
       // };
    //}

    return aa;
}

/*
查找数据
pramas
    obj 操作的json对象
    key 被查找的key
return 带key的集合
*/
function JSONgetData(obj,key){
    //var arr=[];
    var aa=null;
    if(obj instanceof Array){
        for(var i=0;i<obj.length;i++){
            aa=JSONgetData(obj[i],key);
            if(aa!=null){
                //arr=arr.concat(JSONgetData(obj[i],key));
                return aa;
            }
        }
    }else if(typeof(obj)=='object'){//obj instanceof Object
        for(var tmp in obj){
            if(tmp==key){
                //var val='{"'+key+'":"'+obj[key]+'"}';
                //arr.push(val);
                aa=obj[key];
                return aa;
            }else if(typeof(obj[tmp])=='object'){//obj[tmp] instanceof Object
                aa=JSONgetData(obj[tmp], key);
                if(aa!=null){
                    //arr=arr.concat(JSONgetData(obj[tmp], key));
                    return aa;
                }
            }else{
                continue;
            }
        }
    }

    return aa;
}

//序列化
function json2str(obj){
    var arrStr=[];
    for(var i=0;i<obj.length;i++){
        arrStr[i]=JSON.stringify(obj[i]);
    }
    return arrStr.join(' ');
}
//反序列化
function str2json(str){
    var arrJson=[];
    var arr=str.split(' ');
    for(var i=0;i<arr.length;i++){
        arrJson[i]=JSON.parse(arr[i]);
    }

    return arrJson;
}
